﻿using Castle.DynamicProxy;

namespace WebAPI测试程序.AOP
{
    // 1. Nuget 引入：Castle.Core
    // 2. 扩展一个IInterceptor实现方法
    // 3. 注册对象和具体之间的关系的时候，需要执行要支持AOP扩展EnableClassInterceptors
    // 4. 把要扩展aop的方法定义为 virtual 方法
    // 5. 把扩展的 IInterceptor 也要注册到容器中

    // 一、通过EnableClassInterceptors 的情况
    // 1. 需要把 Intercept 标记到具体的实现类上 -- 扩展 IInterceptor 也要引入进来
    // 2. 特点：必须要是虚方法才会进入到 扩展 IInterceptor 来 -- 才会支持aop扩展


    // 二、通过EnableInterfaceInterceptors 的情况
    // 1. 需要把 Intercept 标记到抽象--接口--扩展IInterceptor 也要引入到抽象中
    // 2. 特点：只要是实现了这接口，无论是否是虚方法，都可以进入到IInterceptor 中来，也就是都可以支持AOP
    public class CustomInterceptor : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            System.Reflection.MethodInfo methodInfo = invocation.Method;
            if ("Order".Equals(methodInfo.Name))
            {
                Console.WriteLine("order Service 的 Order 方法调用");
            }
            else
            {
                Console.WriteLine("前置环绕通知");
                invocation.Proceed();
                Console.WriteLine("后置环绕通知");
            }
        }
    }
}
